package com.jiangkai.utils;

import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil {

	private static final Logger log = Logger.getLogger(RedisUtil.class);
	
	/**
	 * //控制台显示访问地址
	 */
	private static String HOST = "127.0.0.1";

	private static int PORT = 6379;
	
	private static String PASSWORD = "123456";
	/**
	 * redis对象
	 */
	public static Jedis jedis = null;
	
	/**
	 * Jredis连接池
	 */
	public static JedisPool jredisPool = null;
	
	/**
	 * 最大空闲连接数, 默认8个 配置为10个
	 */
	public static int jRedisPoolMaxIdle = 10;
	
	/**
	 * 最大连接数, 默认8个 配置为50个
	 */
	public static int jRedisPoolMaxTotal = 50;
	
	/**
	 * 此值作为Redis是否可以连接。
	 */
	public static String KeyOfTestRedis = "KeyOfTestRedis";
	
	/**
	 * 初始化JRedis连接池对象
	 * @param maxidle
	 * @param maxtotal
	 */
	public static void initJRedisPool(int maxidle , int maxtotal){
		JedisPoolConfig config = new JedisPoolConfig();
	    //最大空闲连接数, 应用自己评估，不要超过ApsaraDB for Redis每个实例最大的连接数
	    config.setMaxIdle(maxidle);
	    
	    //最大连接数, 应用自己评估，不要超过ApsaraDB for Redis每个实例最大的连接数
	    config.setMaxTotal(maxtotal);
	    
	    config.setTestOnBorrow(false);
	    config.setTestOnReturn(false);
	    if(jredisPool!=null){
	    	try{
	    		jredisPool.close();
	    	}catch(Exception e){
	    	}	    	
	    	try{
	    		jredisPool.destroy();
	    	}catch(Exception e){
	    	}
	    	jredisPool = null;
	    }
	    jredisPool = new JedisPool(config, HOST, PORT, 3000, PASSWORD);
	}
	
	/**
	 * 从Redis连接池中获取对象。
	 * TODO 此处需要发短信告诉我，为什么连接不上了。
	 * 调用短信接口
	 * @return
	 */
	public static Jedis getJedis() {
		try {
			if (jedis == null) {
				jedis = new Jedis(HOST, PORT);
				// 鉴权信息由用户名:密码拼接而成
//				jedis.auth(PASSWORD);// instance_id:password
			}else{
				//如果此redis对象不为空,看能不能取到值
				try{
					jedis.exists(KeyOfTestRedis);
				}catch(Exception e){
					log.error("[getJedis Error]" , e);
					try{
						jedis.close(); 
					}catch(Exception er){ 
						log.error("[Close Jedis Error]" , e); 
					}
					jedis = null;
					jedis = new Jedis(HOST, PORT);
					jedis.auth(PASSWORD);// instance_id:password
				}
			}
		} catch (Exception e) {
			log.error("[getJedis]",e);
		}
		return jedis;
	}
	
	public static void main(String[] args){
		Jedis jjj =  getJedis();
		try{
			boolean isExist = jjj.exists(KeyOfTestRedis);
			System.out.println("isExist = " + isExist);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jjj.close();
		}
	}
	
}
